package com.itheima.consumer.controller;

import com.itheima.consumer.domain.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @author Administrator
 */

@RestController
@RequestMapping("/goods")
public class ConsumerController {

    /**
     * 可以模拟HTTP client(浏览器)发送请求的类
     */
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 是SpringCloud专门负责服务发现的类
     */
    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/findOne/{id}")
    public Goods findOne(@PathVariable int id) {

        //通过注册到eureka中的实例的名称来获取相关的实例列表
        List<ServiceInstance> serviceInstances = discoveryClient.getInstances("SPRINGCLOUD-PROVIDER");
        if (serviceInstances == null || serviceInstances.size() <= 0) {
            return null;
        }

        //获取第一个服务实例
        ServiceInstance serviceInstance = serviceInstances.get(0);
        //获取服务实例的host值 跟注册到注册中心的hostname相关 可以是ip域名 可以是本机名
        String host = serviceInstance.getHost();
        //获取服务实例的端口
        int port = serviceInstance.getPort();

        String url = "http://"+host+":"+port+"/goods/findOne/" + id;
        /**
         * 使用restTemplate来模拟浏览器发送请求有两种方法
         * 1.getForObject(String url,Class<T>)
         * @param url 想要发送请求的url地址
         * @param Goods.Class 期望的返回结果类型
         *
         *
         * 2.getForEntity()
         * @param url 想要发送请求的url地址
         * @param Goods.Class 期望的返回结果类型
         * @return ResponseEntity<Goods> 返回值为响应实体 封装浏览器的一些头信息 将响应结果封装在响应体中
         *
         */
//        Goods goods = restTemplate.getForObject(url, Goods.class); //暂时注释

        ResponseEntity<Goods> entity = restTemplate.getForEntity(url, Goods.class);

        Goods goods = entity.getBody();
        return goods;
    }
}
